Баратање битовима
Подаци неозначених целобројних типова се у рачунару записују у бинарном запису, док се за означене целе бројеве користи потпуни комплемент. На пример, осмобитни записи из прве колоне могу да се тумаче као неозначени цели бројеви (unsigned char), из опсега 0..255, или као означени цели бројеви (char), из опсега -128..127.
запис вредност неозначеног броја вредност означеног броја 00000000 0 0 00000001 1 1 00000010 2 2 00000011 3 3 00000100 4 4 ... 01111110 126 126 01111111 127 127 10000000 128 -128 10000001 ... 11111110 254 -2 11111111 255 -1
Операције над битовима могу као аргументе да користе и означене и неозначене целобројне податке. У рачунарству је много чешћа и важнија употреба ових операција над неозначеним целобројним подацима, па ћемо у задацима из ове групе углавном да се бавимо неозначеним целим бројевима.
Целобројне константе могу у програмима да се запишу у бинарном
систему, тако што се испред бинарног записа дода ознака 0b
.
На пример, записи 21
и 0b10101
су равноправни
у програмима. Могућ је и запис у хексадекадном систему, тако што се
испред хексадекадног записа дода ознака 0x
. Тако је и
0x15
још један равноправан запис броја 21
(јер
\(1 \cdot 16 + 5 = 21\)).
Над битовима целобројних података могу да се врше логичке битовне
операције. Операција битовне конјункције се означава знаком
&
, битовна дисјункција знаком |
, битовна
негација знаком ~
, а екслклузивна дисјункција знаком
^
. Ове операције се изводе на свакој позицији истовремено и
независно од осталих позиција. На пример, важи да је:
0b00111100 & 0b01010101 == 0b00010100 0b00111100 | 0b01010101 == 0b01111101 0b00111100 ^ 0b01010101 == 0b01101001 ~0b00111100 == 0b11000011
Последња једнакост важи под претпоставком да је резултат операције на левој страни осмобитан (у противном треба дописати одговарајући број водећих јединица).
Осим ових, логичких битовних операција, над битовима могу да се
изводе и операције померања битова (енгл. shift) за дати број места
улево или удесно. За померање улево се користи ознака
<<
, а за померање удесно ознака
>>
. На пример, важи да је:
0b00011010 >> 2 == 0b00000110 0b00011010 << 2 == 0b01101000
При овим операцијама помак мора да буде мањи од броја битова податка. Могуће је да се при померању неки битови и изгубе, на пример
0b00011010 >> 5 == 0b00000000
Постоји један важан специјалан случај померања битова, а то је
померање бинарног записа јединице. На пример, ако је потребно \(k\)-ти бит броја \(a\) слева (бројећи од нуле) поставити на 1,
то можемо да урадимо наредбом a = a | (1<<k)
pozicije k...210 a == aaaaaАaaaaaa 1<<k == 000001000000 ----------------------------- a | (1<<k) == aaaaa1aaaaaa
Слично томе, ако је потребно \(k\)-ти бит броја \(a\) слева (бројећи од нуле) поставити на 0,
то можемо да урадимо наредбом a = a & ~(1<<k)
pozicije k...210 a == aaaaaАaaaaaa ~(1<<i) == 111110111111 ----------------------------- a & ~(1<<k) == aaaaa0aaaaaa
Померање јединице је важно и због тога што се помоћу њега може формирати бит-маска од \(k\) узастопних јединица, помоћу које може да се обрађује \(k\) узастопних позиција:
pozicije k...210 1 << k == 000001000000 (1 << k) - 1 == 000000111111
Kада желимо да издвојимо \(k\)-ти бит броја \(a\) слева (бројећи од нуле), можемо прво да померимо број \(a\) за \(k\) места удесно, а затим израчунамо конјункцију добијеног броја и јединице:
pozicije k...210 a == aaaaaАaaaaaa a >> k == 000000aaaaaА 1 == 000000000001 ----------------------------- (a>>k) & 1 == 00000000000A
Баратање битовима
Подаци неозначених целобројних типова се у рачунару записују у бинарном запису, док се за означене целе бројеве користи потпуни комплемент. На пример, осмобитни записи из прве колоне могу да се тумаче као неозначени цели бројеви (byte), из опсега 0..255, или као означени цели бројеви (sbyte), из опсега -128..127.
запис вредност неозначеног броја вредност означеног броја 00000000 0 0 00000001 1 1 00000010 2 2 00000011 3 3 00000100 4 4 ... 01111110 126 126 01111111 127 127 10000000 128 -128 10000001 ... 11111110 254 -2 11111111 255 -1
Операције над битовима могу као аргументе да користе и означене и неозначене целобројне податке. У рачунарству је много чешћа и важнија употреба ових операција над неозначеним целобројним подацима, па ћемо у задацима из ове групе углавном да се бавимо неозначеним целим бројевима.
Целобројне константе могу у програмима да се запишу у бинарном
систему, тако што се испред бинарног записа дода ознака 0b
.
На пример, записи 21
и 0b10101
су равноправни
у програмима. Могућ је и запис у хексадекадном систему, тако што се
испред хексадекадног записа дода ознака 0x
. Тако је и
0x15
још један равноправан запис броја 21
(јер
\(1 \cdot 16 + 5 = 21\)).
Над битовима целобројних података могу да се врше логичке битовне
операције. Операција битовне конјункције се означава знаком
&
, битовна дисјункција знаком |
, битовна
негација знаком ~
, а екслклузивна дисјункција знаком
^
. Ове операције се изводе на свакој позицији истовремено и
независно од осталих позиција. На пример, важи да је:
0b00111100 & 0b01010101 == 0b00010100 0b00111100 | 0b01010101 == 0b01111101 0b00111100 ^ 0b01010101 == 0b01101001 ~0b00111100 == 0b11000011
Последња једнакост важи под претпоставком да је резултат операције на левој страни осмобитан (у противном треба дописати одговарајући број водећих јединица).
Осим ових, логичких битовних операција, над битовима могу да се
изводе и операције померања битова (енгл. shift) за дати број места
улево или удесно. За померање улево се користи ознака
<<
, а за померање удесно ознака
>>
. На пример, важи да је:
0b00011010 >> 2 == 0b00000110 0b00011010 << 2 == 0b01101000
При овим операцијама помак мора да буде мањи од броја битова податка. Могуће је да се при померању неки битови и изгубе, на пример
0b00011010 >> 5 == 0b00000000
Постоји један важан специјалан случај померања битова, а то је
померање бинарног записа јединице. На пример, ако је потребно \(k\)-ти бит броја \(a\) слева (бројећи од нуле) поставити на 1,
то можемо да урадимо наредбом a = a | (1<<k)
pozicije k...210 a == aaaaaАaaaaaa 1<<k == 000001000000 ----------------------------- a | (1<<k) == aaaaa1aaaaaa
Слично томе, ако је потребно \(k\)-ти бит броја \(a\) слева (бројећи од нуле) поставити на 0,
то можемо да урадимо наредбом a = a & ~(1<<k)
pozicije k...210 a == aaaaaАaaaaaa ~(1<<i) == 111110111111 ----------------------------- a & ~(1<<k) == aaaaa0aaaaaa
Померање јединице је важно и због тога што се помоћу њега може формирати бит-маска од \(k\) узастопних јединица, помоћу које може да се обрађује \(k\) узастопних позиција:
pozicije k...210 1 << k == 000001000000 (1 << k) - 1 == 000000111111
Kада желимо да издвојимо \(k\)-ти бит броја \(a\) слева (бројећи од нуле), можемо прво да померимо број \(a\) за \(k\) места удесно, а затим израчунамо конјункцију добијеног броја и јединице:
pozicije k...210 a == aaaaaАaaaaaa a >> k == 000000aaaaaА 1 == 000000000001 ----------------------------- (a>>k) & 1 == 00000000000A